require "import"
import "android.widget.*"
import "android.view.*"
import "os"
import "android.app.AlertDialog"
import "android.widget.PopupMenu"
import "android.content.Intent"
import "android.net.Uri"

-- Variáveis para armazenar frases
local historicoFrases = {}
local indiceAtual = 1
local modoOffline = false

-- Lista ampliada de 100 frases motivacionais em português
local frasesOffline = {
    "Acredite em si mesmo e tudo será possível.", "O sucesso é a soma de pequenos esforços repetidos dia após dia.",
    "Você é mais forte do que pensa.", "Não espere por oportunidades, crie-as.",
    "O único limite para nossos sonhos é a nossa imaginação.", "Cada dia é uma nova chance de mudar o mundo.",
    "A persistência é o caminho do êxito.", "Grandes coisas nunca vêm de zonas de conforto.",
    "O fracasso é apenas uma oportunidade para recomeçar com mais inteligência.", "A felicidade vem das suas próprias ações.",
    "Seja a mudança que você deseja ver no mundo.", "O que você faz hoje pode melhorar todos os seus amanhãs.",
    "A vida é 10% o que acontece comigo e 90% como eu reajo a isso.", "Nunca é tarde para ser o que você poderia ter sido.",
    "Acreditar é o primeiro passo para alcançar.", "O impossível é apenas uma palavra para os que desistem.",
    "Você não falha até parar de tentar.", "Sonhe grande, trabalhe duro, permaneça focado.",
    "A jornada de mil milhas começa com um único passo.", "O sucesso não é a chave para a felicidade, a felicidade é a chave para o sucesso.",
    "Um dia sem sorrir é um dia perdido.", "Levante-se, sacuda a poeira e dê a volta por cima.",
    "A força não vem do corpo, vem da vontade.", "Toda conquista começa com a decisão de tentar.",
    "Você é o arquiteto do seu próprio destino.", "O melhor ainda está por vir.",
    "Acredite no impossível e faça acontecer.", "Pequenos passos levam a grandes destinos.",
    "A vida é curta demais para desistir dos seus sonhos.", "Você é capaz de mais do que imagina.",
    "A determinação de hoje é o sucesso de amanhã.", "Não há atalhos para o topo, mas a vista vale a pena.",
    "Seja mais forte que suas desculpas.", "O primeiro passo é sempre o mais difícil, mas também o mais importante.",
    "Sua única competição é quem você era ontem.", "Faça o que puder, com o que tiver, onde estiver.",
    "A mudança começa com um único passo.", "O otimismo é a fé que leva à conquista.",
    "Você é o autor da sua própria história.", "A coragem não é a ausência de medo, mas a vitória sobre ele.",
    "Um sonho sem ação é apenas uma ilusão.", "A vida recompensa quem persiste.",
    "Seja luz na escuridão.", "O sucesso é construído um dia de cada vez.",
    "Você é mais corajoso do que acredita.", "A força interior é o maior poder que possuímos.",
    "Transforme obstáculos em oportunidades.", "Acredite no seu potencial ilimitado.",
    "O hoje é o amanhã que você sonhou ontem.", "Não desista, o melhor está por vir.",
    "Você é o dono do seu futuro.", "A vida é um presente, abra-o com entusiasmo.",
    "Cada novo dia é uma página em branco.", "A esperança é o combustível dos sonhos.",
    "Seja gentil consigo mesmo no caminho.", "A persistência supera o talento.",
    "Você é mais resiliente do que pensa.", "O fracasso é temporário, desistir é permanente.",
    "A vida é feita de escolhas, escolha ser feliz.", "Acredite na magia dos novos começos.",
    "Você é a soma das suas decisões.", "O sucesso é uma questão de atitude.",
    "A força está em continuar apesar das quedas.", "Sonhos se tornam realidade com trabalho duro.",
    "Você é o capitão da sua alma.", "A vida é um eco, o que você dá, você recebe.",
    "O impossível só existe até alguém provar o contrário.", "Seja o herói da sua própria história.",
    "A vitória pertence aos que perseveram.", "Você tem o poder de mudar sua vida.",
    "A felicidade é uma escolha diária.", "O futuro pertence aos que acreditam nos seus sonhos.",
    "Você é mais valente do que suas dúvidas.", "A vida é uma aventura, viva-a intensamente.",
    "O sucesso vem para quem não para de tentar.", "Você é um universo de possibilidades.",
    "A determinação move montanhas.", "Seja grato pelo que tem enquanto busca o que quer.",
    "Você é mais poderoso do que suas limitações.", "A vida é um presente, aproveite cada momento.",
    "O primeiro passo para vencer é acreditar.", "Você é o criador da sua realidade.",
    "A resiliência é a chave para superar desafios.", "O amanhã é construído com as escolhas de hoje.",
    "Você é mais brilhante do que as estrelas.", "A coragem é o primeiro passo para a grandeza.",
    "Sonhos grandes exigem ações grandes.", "Você é o mestre do seu destino.",
    "A vida é um espelho, sorria para ela.", "O sucesso é a recompensa da persistência.",
    "Você tem força para superar qualquer coisa.", "Acredite em você, o mundo acreditará também.",
    "O caminho é longo, mas a vitória é certa.", "Você é uma obra em progresso, e isso é lindo.",
    "A vida é uma dança, encontre seu ritmo.", "O poder de vencer está dentro de você.",
    "Você é mais do que suas circunstâncias.", "A esperança é a luz que guia o caminho."
}

-- URLs de APIs alternativas para frases online
local apiUrls = {
    "https://api.quotable.io/quotes?lang=pt",
    "https://api.quotable.io/quotes",
    "https://zenquotes.io/api/quotes"
}

-- Índice da URL atual sendo tentada
local indiceUrl = 1

-- Função para buscar frases motivacionais online
local function buscarFrasesMotivacionais(callback)
    textoResposta.setText("Buscando frases online...")
    service.speak("Buscando frases online...")
    
    local function tentarProximaUrl()
        local url = apiUrls[indiceUrl]
        
        Http.get(url, function(status, dados)
            if status == 200 and dados and type(dados) == "string" then
                local novasFrases = 0
                local padroes = {
                    {padrao = '"content":"(.-)","author":"(.-)"', processarTexto = function(texto) return texto:gsub('\\"', '"') end},
                    {padrao = '"q":"(.-)","a":"(.-)"', processarTexto = function(texto) return texto:gsub("\\u0026#39;", "'"):gsub("\\u0026quot;", '"') end}
                }
                
                for _, padrao in ipairs(padroes) do
                    for texto, autor in dados:gmatch(padrao.padrao) do
                        local frase = {texto = padrao.processarTexto(texto), autor = autor}
                        local duplicada = false
                        for _, f in ipairs(historicoFrases) do
                            if f.texto == frase.texto then duplicada = true break end
                        end
                        if not duplicada then
                            table.insert(historicoFrases, frase)
                            novasFrases = novasFrases + 1
                        end
                    end
                    if novasFrases > 0 then break end
                end
                
                if novasFrases > 0 then
                    callback(historicoFrases[#historicoFrases])
                else
                    indiceUrl = indiceUrl + 1
                    if indiceUrl <= #apiUrls then
                        tentarProximaUrl()
                    else
                        textoResposta.setText("Nenhuma frase válida encontrada online. Usando offline.")
                        service.speak("Usando frase offline.")
                        callback({texto = frasesOffline[math.random(#frasesOffline)], autor = "Desconhecido"})
                    end
                end
            else
                indiceUrl = indiceUrl + 1
                if indiceUrl <= #apiUrls then
                    tentarProximaUrl()
                else
                    textoResposta.setText("Erro na conexão ou dados inválidos. Usando frase offline.")
                    service.speak("Erro na conexão. Usando frase offline.")
                    callback({texto = frasesOffline[math.random(#frasesOffline)], autor = "Desconhecido"})
                end
            end
        end)
    end
    
    indiceUrl = 1
    tentarProximaUrl()
end

-- Função para processar e exibir frase
function exibirFrase()
    if #historicoFrases == 0 and not modoOffline then
        textoResposta.setText("Nenhuma frase carregada ainda. Aguarde...")
        return
    end
    
    local frase
    if modoOffline then
        frase = {texto = frasesOffline[indiceAtual], autor = "Desconhecido"}
    else
        frase = historicoFrases[indiceAtual]
    end
    
    local texto = string.format("%s\n\nAutor: %s\n", frase.texto, frase.autor)
    textoResposta.setText(texto)
    service.speak(frase.texto)
end

-- Layout da interface com botão "Frases Online" adicionado
layout = {
    LinearLayout;
    orientation = "vertical";
    layout_width = "match_parent";
    layout_height = "match_parent";
    backgroundColor = "#000000";
    padding = "10dp";
    {
        ScrollView;
        layout_width = "match_parent";
        layout_height = "0dp";
        layout_weight = "1";
        {
            LinearLayout;
            orientation = "vertical";
            layout_width = "match_parent";
            layout_height = "wrap_content";
            {TextView;
                id = "textoResposta";
                layout_width = "match_parent";
                layout_height = "wrap_content";
                text = "Bem-vindo ao aplicativo de Frases Motivacionais. Carregando...",
                textSize = "16sp";
                textColor = "#ffffff";
                padding = "10dp";};
        };
    };
    {
        LinearLayout;
        orientation = "horizontal";
        layout_width = "match_parent";
        layout_height = "wrap_content";
        gravity = "center";
        {
            Button;
            text = "Frase Anterior";
            id = "botaoAnterior";
            textColor = "#ffffff";
            backgroundColor = "#0066AA";
            layout_width = "wrap_content";
            layout_height = "wrap_content";
            layout_margin = "5dp";
            onClick = function()
                if modoOffline then
                    indiceAtual = math.random(1, #frasesOffline)
                    exibirFrase()
                elseif indiceAtual > 1 then
                    indiceAtual = indiceAtual - 1
                    exibirFrase()
                else
                    textoResposta.setText("Esta é a primeira frase!")
                    service.speak("Esta é a primeira frase!")
                end
            end;
        };
        {
            Button;
            text = "Próxima Frase";
            id = "botaoProxima";
            textColor = "#ffffff";
            backgroundColor = "#0066AA";
            layout_width = "wrap_content";
            layout_height = "wrap_content";
            layout_margin = "5dp";
            onClick = function()
                if modoOffline then
                    indiceAtual = math.random(1, #frasesOffline)
                    exibirFrase()
                elseif indiceAtual < #historicoFrases then
                    indiceAtual = indiceAtual + 1
                    exibirFrase()
                else
                    textoResposta.setText("Carregando novas frases...")
                    service.speak("Carregando novas frases...")
                    buscarFrasesMotivacionais(function(frase)
                        indiceAtual = #historicoFrases
                        exibirFrase()
                    end)
                end
            end;
        };
    };
    {
        Button;
        text = "Frases Online";
        textColor = "#ffffff";
        backgroundColor = "#0066AA"; -- Azul para indicar modo online
        layout_width = "match_parent";
        layout_height = "wrap_content";
        layout_margin = "10dp";
        onClick = function()
            modoOffline = false
            if #historicoFrases > 0 then
                indiceAtual = math.random(1, #historicoFrases)
                exibirFrase()
                textoResposta.setText("Modo online ativado! Navegue pelas frases carregadas.")
                service.speak("Modo online ativado!")
            else
                textoResposta.setText("Carregando frases online...")
                service.speak("Carregando frases online...")
                buscarFrasesMotivacionais(function(frase)
                    indiceAtual = #historicoFrases
                    exibirFrase()
                end)
            end
        end;
    };
    {
        Button;
        text = "Frases Offline";
        textColor = "#ffffff";
        backgroundColor = "#00AA00";
        layout_width = "match_parent";
        layout_height = "wrap_content";
        layout_margin = "10dp";
        onClick = function()
            modoOffline = true
            indiceAtual = math.random(1, #frasesOffline)
            exibirFrase()
            textoResposta.setText("Modo offline ativado! Clique nos botões para frases aleatórias.")
            service.speak("Modo offline ativado!")
        end;
    };
    {
        Button;
        text = "Frase Aleatória";
        textColor = "#ffffff";
        backgroundColor = "#FF8800";
        layout_width = "match_parent";
        layout_height = "wrap_content";
        layout_margin = "10dp";
        onClick = function()
            if modoOffline then
                indiceAtual = math.random(1, #frasesOffline)
                exibirFrase()
            elseif #historicoFrases > 0 then
                indiceAtual = math.random(1, #historicoFrases)
                exibirFrase()
            else
                textoResposta.setText("Carregando novas frases...")
                service.speak("Carregando novas frases...")
                buscarFrasesMotivacionais(function(frase)
                    indiceAtual = #historicoFrases
                    exibirFrase()
                end)
            end
        end;
    };
    {
        Button;
        text = "Sair";
        backgroundColor = "#AA0000";
        textColor = "#ffffff";
        layout_width = "wrap_content";
        layout_height = "wrap_content";
        onClick = function()
            dlg.dismiss()
        end;
    };
}

-- Inicialização do diálogo
dlg = LuaDialog()
dlg.setTitle("Frases Motivacionais")
local view = loadlayout(layout)
dlg.setView(view)
dlg.show()

-- Carregar uma frase aleatória online ao iniciar
service.speak("Bem-vindo ao aplicativo de Frases Motivacionais. Carregando uma frase...")
buscarFrasesMotivacionais(function(frase)
    if #historicoFrases > 0 then
        indiceAtual = math.random(1, #historicoFrases)
        exibirFrase()
    end
end)